/**
 * created by 江心才子, 2019/8/13
 * Copyright (c) 2019, 270628297@qq.com All Rights Reserved.
 * #                   *********                            #
 * #                  ************                          #
 * #                  *************                         #
 * #                 **  ***********                        #
 * #                ***  ****** *****                       #
 * #                *** *******   ****                      #
 * #               ***  ********** ****                     #
 * #              ****  *********** ****                    #
 * #            *****   ***********  *****                  #
 * #           ******   *** ********   *****                #
 * #           *****   ***   ********   ******              #
 * #          ******   ***  ***********   ******            #
 * #         ******   **** **************  ******           #
 * #        *******  ********************* *******          #
 * #        *******  ******************************         #
 * #       *******  ****** ***************** *******        #
 * #       *******  ****** ****** *********   ******        #
 * #       *******    **  ******   ******     ******        #
 * #       *******        ******    *****     *****         #
 * #        ******        *****     *****     ****          #
 * #         *****        ****      *****     ***           #
 * #          *****       ***        ***      *             #
 * #            **       ****        ****                   #
 */
package com.wyl.base;

import android.content.Context;
import android.text.TextUtils;
import android.widget.Toast;
import cn.beecloud.BCPay;
import cn.beecloud.BeeCloud;
import cn.beecloud.async.BCResult;
import cn.beecloud.entity.BCPayResult;
import cn.beecloud.entity.BCReqParams;
import com.wyl.libbase.extend.ContextExtendsKt;
import com.wyl.libbase.utils.KLog;

import java.util.HashMap;
import java.util.Random;

/**
 * 项目名称：ShortVideo
 * 创建人：江心才子
 * 创建时间：2019-08-13 14:01
 * 内容描述：
 * 修改说明：
 */
public class BeeCloudHelper {

    private BeeCloudHelper() {

    }

    private static BeeCloudHelper instance = new BeeCloudHelper();

    public static BeeCloudHelper getInstance() {
        return instance;
    }

    public void initBeeCloud(Context context) {
        BeeCloud.setAppIdAndSecret(ConstantKt.BeecloudAppId, ConstantKt.BeecloudSecret);
        // 如果用到微信支付，在用到微信支付的Activity的onCreate函数里调用以下函数.
        // 第二个参数需要换成你自己的微信AppID.
        String initInfo = BCPay.initWechatPay(context, ConstantKt.WechatAppID);
        if (initInfo != null) {
            ContextExtendsKt.toast(context, "微信初始化失败：" + initInfo, Toast.LENGTH_SHORT);
        }
    }


    /*支付宝支付*/
    public void payZhiFuBao(Context context, String number, String money, String userid, Result callback) {
        BCPay.PayParams aliParam = new BCPay.PayParams();
        aliParam.channelType = BCReqParams.BCChannelTypes.ALI_APP;

        //订单标题
        aliParam.billTitle = System.currentTimeMillis() + getNum();
        aliParam.billNum = System.currentTimeMillis() + getNum();
        aliParam.billTotalFee = ceilInt(parseDouble(money) * 100);    //订单金额(分)
        aliParam.optional = new HashMap<>();
        aliParam.optional.put("number", number);
        aliParam.optional.put("type", "1");
        aliParam.optional.put("money", money);
        aliParam.optional.put("appUserId", userid);

        BCPay.getInstance(context).reqPaymentAsync(
                aliParam,
                //支付完成后回调入口
                bcResult -> handlePayResult(bcResult, callback)
        );
    }


    /*微信支付*/
    private double parseDouble(String price) {
        if (TextUtils.isEmpty(price)) {
            return 0;
        }
        double d = 0;
        try {
            d = Double.parseDouble(price);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return d;
    }


    /*微信支付*/
    public void payWeiXin(Context context, String number, String money, String userid, Result callback) {
        //对于微信支付, 手机内存太小会有OutOfResourcesException造成的卡顿, 以致无法完成支付
        //这个是微信自身存在的问题
        if (BCPay.isWXAppInstalledAndSupported() && BCPay.isWXPaySupported()) {
            BCPay.PayParams payParams = new BCPay.PayParams();
            payParams.channelType = BCReqParams.BCChannelTypes.WX_APP;

            // number数量 type类型   money总价 appUserId用户id    支付的时候需要传4个字段给我
            //订单标题
            payParams.billTitle = System.currentTimeMillis() + getNum();
            payParams.billNum = System.currentTimeMillis() + getNum();
            payParams.billTotalFee = ceilInt(parseDouble(money) * 100);    //订单金额(分)
            payParams.optional = new HashMap<>();
            payParams.optional.put("number", number);
            payParams.optional.put("type", "2");
            payParams.optional.put("money", money);
            payParams.optional.put("appUserId", userid);

            BCPay.getInstance(context).reqPaymentAsync(
                    payParams,
                    //支付完成后回调入口
                    bcResult -> handlePayResult(bcResult, callback)
            );
        } else {
            ContextExtendsKt.toast(context, "您尚未安装微信或者安装的微信版本不支持", Toast.LENGTH_SHORT);
        }
    }

    private void handlePayResult(BCResult bcResult, Result callback) {
        //pay.setClickable(true);
        final BCPayResult bcPayResult = (BCPayResult) bcResult;
        //此处关闭loading界面
        //根据你自己的需求处理支付结果
        String result = bcPayResult.getResult();
        KLog.e("BCCallback", result + "=" + bcPayResult.getErrMsg() + "=" + bcPayResult.getErrCode());
          /*
          注意！
          所有支付渠道建议以服务端的状态金额为准，此处返回的RESULT_SUCCESS仅仅代表手机端支付成功
          */
        if (result.equals(BCPayResult.RESULT_SUCCESS)) {
            KLog.d("支付成功");
            callback.onSuccess();
            return;
        }
        if (result.equals(BCPayResult.RESULT_CANCEL)) {
            KLog.d("支付取消");
            callback.onCancel();
            return;
        }
        String toastMsg;
        if (result.equals(BCPayResult.RESULT_FAIL)) {
            if (bcPayResult.getErrCode() == -12) {
                toastMsg = "您尚未安装支付软件";
            }
            toastMsg = "支付失败,请稍后重试";
            KLog.i("done: 支付失败的原因" + "支付失败, 原因: " + bcPayResult.getErrCode() +
                    " # " + bcPayResult.getErrMsg() +
                    " # " + bcPayResult.getDetailInfo());
            KLog.e("支付错误..............", toastMsg);
            /* * 你发布的项目中不应该出现如下错误，此处由于支付宝政策原因，
             * 不再提供支付宝支付的测试功能，所以给出提示说明*/

            if (bcPayResult.getErrMsg().equals("PAY_FACTOR_NOT_SET") &&
                    bcPayResult.getDetailInfo().startsWith("支付宝参数")) {
                toastMsg = "支付失败：由于支付宝政策原因，故不再提供支付宝支付的测试功能，给您带来的不便，敬请谅解";
            }
        } else if (result.equals(BCPayResult.RESULT_UNKNOWN)) {
            //可能出现在支付宝8000返回状态
            toastMsg = "订单状态未知";
        } else {
            toastMsg = "invalid return";
        }
        KLog.d(toastMsg);
        callback.onFailed(toastMsg);
    }


    private int ceilInt(double number) {
        return (int) Math.ceil(number);
    }

    private String getNum() {
        StringBuilder sb = new StringBuilder();
        //随机生成6位数  发送到聚合
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            int a = random.nextInt(10);
            sb.append(a);
        }
        return sb.toString();
    }

    public interface Result {
        void onSuccess();

        void onCancel();

        void onFailed(String msg);
    }

}